import {
  generateHtml,
  getMarker,
  getPrevGroupsStr,
  getMaxArrayLength,
  getMaxCorrectStreakStr,
  getMaxWrongStreakStr,
  getTimeAndNumberStr,
  getPrevGroupAccuracyStr,
  getCorrectCountStr,
  getWrongCountStr,
  getTotalCountStr,
  getAccuracyStr,
  getPrevAllGroupsItemsStr,
  getCurrentGroupsStr,
  calculateAccuracy
} from '@/utils/study.js'

/**
 * 获取唯一且排序的组号
 * @param {Object[]} allGroupAccuracy - 所有组的准确率数据
 * @param {string} key - 组号的键名（'prevGroupsNumber' 或 'groupsNumber'）
 * @returns {number[]} - 唯一且排序后的组号数组
 */
const getUniqueSortedNumbers = (allGroupAccuracy, key) => {
  const numbers = allGroupAccuracy.reduce((acc, group) => {
    if (Array.isArray(group[key])) {
      acc.push(...group[key])
    }
    return acc
  }, [])
  return Array.from(new Set(numbers)).sort((a, b) => a - b)
}

/**
 * 格式化系列所有组的准确率
 * @param {Array} params - 图表系列的参数数组
 * @returns {string} - 格式化后的HTML字符串
 */
export const formatterForSeriesAllGroupAccuracy = function (params) {
  if (!Array.isArray(params) || params.length === 0) return ''
  // 从参数数组中获取第一个数据项
  const item = params[0]

  // 使用解构赋值，从 item.data 中提取所需的属性
  const {
    sourceData, // 包含号码和时间的源数据
    valueCount, // 计数数组，记录不同值出现的次数
    maxCorrectStreak, // 最大连续正确次数
    maxWrongStreak, // 最大连续错误次数
    allGroupAccuracy // 所有组的准确率数据
  } = item.data

  // 获取当前数据项的颜色属性，用于后续的样式或标记
  const color = item.color

  // 将 sourceData 中的号码从字符串类型转换为数字类型，确保后续数值计算的准确性
  const number = Number(sourceData.number)

  // 根据颜色获取当前的标记，这可能是一个HTML字符串或符号，用于在生成的HTML中显示颜色相关的标记
  const currentMarker = getMarker(color)

  // 计算准确率，调用辅助函数 calculateAccuracy，并传入 valueCount 数组
  // 该函数返回一个四舍五入到两位小数的准确率百分比
  const accuracy = calculateAccuracy(valueCount)

  // 获取所有前期组号，调用辅助函数 getUniqueSortedNumbers
  // 传入 allGroupAccuracy 数据和键名 'prevGroupsNumber'，返回唯一且排序后的前期组号数组
  const prevAllGroupsNumber = getUniqueSortedNumbers(allGroupAccuracy, 'prevGroupsNumber')

  // 获取所有当前组号，调用辅助函数 getUniqueSortedNumbers
  // 传入 allGroupAccuracy 数据和键名 'groupsNumber'，返回唯一且排序后的当前组号数组
  const currentAllGroupsNumber = getUniqueSortedNumbers(allGroupAccuracy, 'groupsNumber')

  // 生成各部分的HTML
  const components = [
    // 生成时间和号码的HTML字符串
    getTimeAndNumberStr(currentMarker, sourceData.time, number, color),

    // 生成前期组准确性的HTML字符串
    getPrevGroupAccuracyStr(color, item.value),

    // 生成正确次数的HTML字符串
    getCorrectCountStr(valueCount, 10),

    // 生成最大连续正确次数的HTML字符串
    getMaxCorrectStreakStr(maxCorrectStreak),

    // 生成错误次数的HTML字符串
    getWrongCountStr(valueCount, 0),

    // 生成最大连续错误次数的HTML字符串
    getMaxWrongStreakStr(maxWrongStreak),

    // 生成总期数的HTML字符串
    getTotalCountStr(valueCount, 10, 0),

    // 生成准确率的HTML字符串
    getAccuracyStr(accuracy),

    // 生成前期组号的HTML字符串
    getPrevGroupsStr(prevAllGroupsNumber, number, color),

    // 生成当前组号的HTML字符串
    getCurrentGroupsStr(currentAllGroupsNumber, number, color)
  ]

  // 生成上期所有组项目的HTML字符串
  const prevAllGroupsItemsStr = getPrevAllGroupsItemsStr(allGroupAccuracy, number, color)

  // 计算宽度
  const numberWidth = 25
  const maxArrayLength = getMaxArrayLength(prevAllGroupsNumber, currentAllGroupsNumber)
  const width = `${maxArrayLength * numberWidth + 250}px`

  // 生成最终HTML
  return generateHtml(components, width, prevAllGroupsItemsStr)
}
